package com.titaniume.java3;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import com.titaniume.java2.Employee;
import com.titaniume.java2.EmployeeData;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @program: JavaSenior
 * @description:
 * @author: renfei.huang
 * @create: 2021-11-02 17:24
 */
public class StreamAPITest1 {


    //1.筛选与切片
    @Test
    public void test1() {
        List<Employee> employees = EmployeeData.getEmployees();

        //filter(Predicat p ) 接收 Lambda 从流中排除某些元素
        Stream<Employee> stream = employees.stream();
        stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);

        System.out.println("------------------------------");
        //limit(n) 阶段流 使其元素不超过给定数量
        employees.stream().limit(3).forEach(System.out::println);
        System.out.println("------------------------------");

        //snip(n) 跳过元素，返回一个扔掉 了前n 元素的数据。若流中元素不足n个，则返回一个与limit 互补
        employees.stream().skip(4).forEach(System.out::println);
        System.out.println("------------------------------");

        //distanct() 筛选 通过流生成元素的hashCode()和equals() 去除重复元素
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.add(new Employee(1001, "马化腾", 34, 6000.38));
        employees.stream().distinct().forEach(System.out::println);
    }

    //map(Function f) 接收一个函数作为参数，该函数会被应用到每个元素上，并将其映射成一个新的元素。
    @Test
    public void test2() {

        List<String> list = Arrays.asList("aa", "bb", "cc", "dd");
        list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);

        //练习一：获取员工姓名长度大于3的员工姓名

        List<Employee> employees = EmployeeData.getEmployees();

        employees.stream()
                .map(Employee::getName)
                .filter(e -> e.length() > 3).forEach(System.out::println);

        //flatMap(Function f) 接收一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流连接成一个流

        //练习二

        Stream<Stream<Character>> streamStream = list.stream().map(StreamAPITest1::formStringToStream);
        streamStream.forEach( s->s.forEach(
                System.out::println
        ));

        //flatMap
        Stream<Character> characterStream = list.stream().flatMap(StreamAPITest1::formStringToStream);
        characterStream.forEach(System.out::println);

//        ArrayList list1 = new ArrayList<>();
//        list1.add(1);
//        list1.add(2);
//        list1.add(3);
//        list1.add(4);
//
//
//        ArrayList list2 = new ArrayList<>();
//
//        list2.add("abc");
//        list2.add("def");
//        list2.add("gh");
//
//        list1.addAll(list2);
//        System.out.println(list1);


    }

    //将字符串中的郭哥字符构成的集合装换成对应的Stream的实例
    public static Stream<Character> formStringToStream(String str) {

        ArrayList<Character> list = new ArrayList<>();
        for (Character c : str.toCharArray()) {
            list.add(c);
        }
        return list.stream();
    }


    @Test
    public  void test3(){


//        sorted() 产生一个新流，其中按自然顺序排序
        List<Integer> list = Arrays.asList(12, 343, 545, 2, 767, 22);
        list.stream().sorted().forEach(System.out::println);


        List<Employee> employees = EmployeeData.getEmployees();
        employees.stream()
                .map(Employee::getName)
                .sorted().forEach(System.out::println);


//        sorted(Comparator com) 产生一个新流，其中按比较器顺序排序


        employees.stream().sorted((e1,e2)->  Integer.compare(e1.getAge(),e2.getAge())).forEach(System.out::println);
        System.out.println("-------------------");

        employees.stream().sorted((e1,e2)->{
          int ageVal =  Integer.compare(e1.getAge(),e2.getAge());
          if(ageVal!= 0 ){
              return  ageVal;
          }else {
              //姓名一样从大到小
              return - Double.compare(e1.getSalary(),e2.getSalary());
          }
        }).forEach(System.out::println);




    }
}
